본문 바로가기

프로젝트23

스프링 부트 프로젝트에 AOP로 트랜잭션 처리하기 ㅁ 하나의 서비스에 하나의 쿼리만 실행시, 쿼리가 성공적으로 수행되면 자동으로 스프링에서 커밋처리가 된다.- 그런데 하나의 서비스에 여러 dml문을 수행할 때가 있다.여러 dml문이 정상적으로 다 완료되었을 때만 커밋이 진행되어야 한다.중간에 하나라도 예외가 발생하면 rollback해서 모든 dml문들이 취소되어야 한다.   ㅁ 스프링 부트의 경우- ~ServiceImpl 클래스의 트랜잭션 처리가 필요한 메소드(여러개의 쿼리를 실행하는 메소드)들 위에 @Transactional을 붙인다.- 각 메소드 위가 아닌 클래스 위에 @Transactional을 붙이면 이 클래스 안의 모든 메소드에 트랜잭션 처리가 적용된다.    ㅁ - 스프링 부트에서 @Transactional처럼 내장된 AOP 기능을 사용할 때.. 2024. 12. 2.
Interceptor로 관리자 권한 체크하기 ㅁ Interceptor (정확히는 HandlerInterceptor)- servlet에서 특정 controller가 실행되기 전, 실행된 후에 낚아채서 실행할 내용을 정의할 수 있다.- 특정 요청을 할 수 있는 회원이 맞는지(로그인 여부 판단),특정 요청을 할 수 있는 권한이 맞는지(회원의 권한 체크) - preHandle(전처리 담당 메소드) : DispatcherServlet이 특정 Controller를 호출하기 전에 낚아채는 영역- postHandle(후처리 담당 메소드) : Controller에서 요청 처리 후 DispatcherServlet으로 뷰 정보가 돌아가는 순간 낚아채는 영역     ㅁ 현재 문제점    - 관리자 계정이 아닌 일반 계정으로 로그인해본다.      - 주소창에 http:.. 2024. 12. 1.
스프링 스케줄러를 사용해서 매일 밤 12시에 쿼리 실행하기 ㅁ 참고- https://moca7.tistory.com/333 스프링 스케줄러 글- https://moca7.tistory.com/340 스프링부트 스케줄러 글    ㅁ 스프링의 경우 (1) 매번 묵시적으로 실행시키고자 하는 작업들을 정의할 클래스를 만들기- 그리고 그 클래스를 빈으로 등록한다. 빈등록은 3가지 방법이 있었다. (2) 해당 클래스 내에 각 작업별 메소드를 작성하기- 반환형은 반드시 void여야 하고, 매개변수는 없어야 한다. 메소드명은 상관없다.- 메소드 위에 @Scheduled 어노테이션을 부여한다. (3) servlet-context.xml에서 스케줄링을 사용하기 위해 task를 추가하기     ㅁ 스프링 부트의 경우 - (3)번 대신 스프링 부트 프로젝트를 만들면 기본으로 만들어지.. 2024. 12. 1.
coolsms로 예약 신청 결과 문자로 전송하기 ㅁ coolsms란?- 기업 및 개발자를 위한 메시지 발송 플랫폼으로, SMS, LMS, MMS, 카카오 알림톡 등의 메시지를 안정적이고 빠르게 발송할 수 있는 API 서비스입니다. 이 API를 쉽게 사용할 수 있도록 다양한 프로그래밍 언어용 SDK(라이브러리)도 함께 제공합니다.   ㅁ coolsms 홈페이지- https://coolsms.co.kr/ 세상에서 가장 안정적이고 빠른 메시지 발송 플랫폼 - 쿨에스엠에스손쉬운 결제 전용계좌, 신용카드, 계좌이체 등 국내 결제 뿐만 아니라 해용신용카드로 한번의 카드번호 등록으로 자동충전까지 지원합니다. 전용계좌, 신용카드, 계좌이체 등 다양한 결제 방식coolsms.co.kr    ㅁ 순서 (1) 홈페이지에서 회원가입을 하고 본인 인증을 한다. (2) API.. 2024. 11. 30.
[문제] 예약 내역에서 비품이 안 보임 ㅁ 문제 발생   - 현재 예약 테이블에 예약 데이터가 비품 하나, 시설 하나 있는 상태다.(맨 위는 정적으로 임시로 박아놓은 데이터다.) - 화면에서 list를 받아서, classifcation이 "비품"이냐 "시설"이냐에 따라서 조건처리를 해서 화면에 뿌려주는데 이상하게 나온다.     ㅁ 원인    - ReservationDto를 다음 List를 조회해와서 model 객체에 담았다.- 그리고 List에서 ReservationDto를 꺼내서 이 예약이 비품 예약인지, 시설 예약인지 판단 후에 classification의 값을 담았는데, 계속 덮어 씌워져서 "비품" 예약도 "시설" 예약으로 조건처리되어서 분류, 번호, 이름을 못뽑고 있었다.     ㅁ 해결    - ReservationDto에 Stri.. 2024. 11. 27.
[문제] 나갔다 들어오면 채팅이 안보임 ㅁ 문제 발생    - user1과 user2가 채팅방 1에 접속해서 서로 메세지를 보냈다. 지금은 정상적으로 메세지가 잘 보인다.        - 문제는 user1이 다른 채팅방을 갔다가 다시 이전에 있던 채팅방으로 돌아와서 메세지를 보내면, 계속 채팅방 1에 접속해있던 user2는 그 메세지가 보이지만 user1은 자기 메세지도 상대가 보낸 메세지도 화면에 보이지 않는다.       ㅁ 원인  - 맨 처음에는 채팅방 1에 연결되어 있는 세션이 2개다.    - user1이 다른 방에 갔다가 다시 채팅방 1로 돌아와서 메세지를 보낸 경우, 현재 채팅방 1에 연결되어 있는 세션이 1개다.user2의 세션은 남아있지만 user1의 세션은 제거되고 다시 추가가 되지 않고 있다.      ㅁ 해결 @Requi.. 2024. 11. 19.
[문제] 1대1 채팅방 상대의 사번이 보이지 않고 내 사번이 보임 ㅁ 문제 발생   - 사번이 B0001인 사원으로 로그인해서 사번이 B0005인 사원과 1:1 채팅방을 만들었다.- B0001인 사원은 상대방인 B0005가 잘 보인다.     - 사번이 B0005인 사원으로 로그인하고 메신저 페이지로 왔다.상대방 사번인 B0001이 보여야 하는데 내 사번인 B0005가 보인다.      // 2. 로그인한 유저가 속한 채팅방 리스트 조회하기. List list = chatService.selectChatRoomList(userNo); // 로그인한 유저가 속한 채팅방 DTO가 list로 담김.  List> list2 = new ArrayList(); // 응답 페이지로 넘길 list.   for(ChatRoomDto c : list) {    Map map = new .. 2024. 11. 14.
파이널 프로젝트 받아오기 [초대받은 팀원 입장]    ㅁ https://moca7.tistory.com/334- 여기서 sts4 설치부터 한다.- sts4 설치하고 워크스페이스 선택해서 실행까지 일단 한다.  ㅁ https://moca7.tistory.com/229- 세미 설정 때처럼 C:\workspaces에 final-workspace 폴더를 만든다.- sts4로 워크스페이스를 C:\workspaces\final-workspace로 선택하고 실행(launch)한다.이러면 C:\workspaces\fianl-workspace에 ".metadata" 폴더가 만들어진다. - 이 글의 워크스페이스 세팅, 서버 세팅은 건너뛴다. - 프로젝트를 깃에서 가져온다.현재 C:\workspaces\semi-workspace에 프로젝트는 없는 .. 2024. 11. 8.
Spring Boot 프로젝트에 Swagger 적용하기 https://velog.io/@gmlstjq123/SpringBoot-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EC%97%90-Swagger-UI-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0 https://colabear754.tistory.com/99   ㅁ 의존성을 추가할 파일- Gradle : build.gradle 파일에 의존성 추가.- Maven : pom.xml 파일에 의존성 추가. - 의존성을 추가한다는 것은 프로젝트에서 사용할 외부 라이브러리나 코드를 프로젝트에 포함시킨다는 의미다.     ㅁ 라이브러리 (Springdoc-openapi 사용) - Springfox, Springdoc 라이브러리에서 Swagger UI를 제공한다. - Spri.. 2024. 11. 7.
파이널 프로젝트 만들기 (스프링 부트) [프로젝트를 만들어서 깃에 올리는 사람 입장]   (0) 깃에 워크스페이스가 아닌 프로젝트를 올린다.- 팀원 중 한명만 프로젝트를 올리고 다른사람을 초대할 수 있다.- 다른 팀원들은 모두 다 워크스페이스를 각자 만들어야 한다. 워크스페이스 세팅도 각자 해야 한다.- 워크스페이스 세팅, 서버세팅은 다 각자해야 한다. - 프로젝트는 한명이 만든다. 프로젝트 이름은 팀명을 따서 각 팀별로 다르게 만든다. - 스프링 부트 프로젝트다. STS4, 스프링 부트 버전 3.2.11, 자바 17버전을 사용한다.   (1) C:\workspaces에 final-workspace 폴더를 만든다.   (2) sts4로 워크스페이스를 C:\workspaces\final-workspace로 선택하고 실행한다.- 이러면 C:\wo.. 2024. 11. 6.
[오류] 응답이 이미 커밋된 후에는, sendRedirect()를 호출할 수 없습니다. - "응답이 이미 커밋된 후에는, sendRedirect()를 호출할 수 없습니다."라는 오류가 뜬다.    ㅁ 원인- 서블릿이 이미 클라이언트에게 응답을 보낸 후에 sendRedirect()를 호출했을 때 발생.클라이언트에게 HTTP 응답이 완료된 이후에 추가적인 응답을 보내려고 할 때 발생하는 문제.   - 조건문으로 나누긴 했지만 하나의 if~else문이 아닌 2개의 if문에 sendRedirect 메소드가 있다.- 회원정보를 제대로 입력하면 오류가 뜨지 않지만, 잘못 입력하면 아까 같은 오류가 뜬다. - 그 이유는 response.sendRedirect()는 한 번만 호출되어야 하는데, 2번 호출되기 때문이다.- sendRedirect()는 즉시 메소드 실행을 종료하는 것이 아니기 때문에, 메소드.. 2024. 9. 27.
[오류] 빈문자열을 insert하는 경우, java.sql.SQLIntegrityConstraintViolationException - 사용자로부터 text 타입의 input 요소로 값을 받아옴. 값을 입력한 경우에는 오류가 발생하지 않는데 값을 입력하지 않으면 오류가 발생한다.- 분명 빈문자열인데, 오류 내용은 NULL을 NOT NULL 제약조건이 걸린 컬럼에 insert할 수 없다고 한다.   ㅁ 원인 - 데이터베이스는 빈 문자열을 null로 간주할 수 있다.그래서 NOT NULL인 컬럼에 빈 문자열을 넣을 수 없다.  ㅁ 해결  - 빈 문자열의 경우 다른 값이 들어가게 하니 해결되었다. 2024. 9. 27.
[오답] SYSDATE로 INSERT한 데이터가 조회되지 않음 - 진료예약 '추가' 기능으로 오늘 날짜로 예약을 추가했으나, 조회에서 보이지 않음.- 예전 날짜들의 예약은 보이는데 오늘 날짜로 예약을 추가하면 보이지 않는다.    ㅁ 원인 - DATE 타입 필드에서 BETWEEN을 사용할 때, 날짜 비교 시 포함되는 범위 문제.- BETWEEN을 사용할 때 날짜 범위에 포함되는 시간을 고려하지 않으면 오늘 날짜 (2024-09-26)가 검색되지 않을 수 있다. Oracle에서 DATE 타입이 날짜뿐만 아니라 시간까지 포함하고 있기 때문입니다.- BETWEEN 연산자를 사용할 경우, 2024-09-26의 시간까지 포함되지 않으면 검색 범위에 들어오지 않을 수 있습니다.즉, BETWEEN '2009-01-26' AND '2024-09-26'은 2024-09-26 00:.. 2024. 9. 26.
[오류] java.sql.SQLSyntaxErrorException - 의료진 계정을 삭제하는 기능 구현에서 sql 문법 에러 발생.    - String 변수에 주민등록번호를 여럿 담아서, String  배열 형태로 jsp에서 가져왔다.- 배열의 길이만큼 조건을 추가해서 doctor 테이블에서 삭제해야 한다.     (1) 쿼리  DELETE   FROM                DOCTORWHERE                   USER_NO IN ( SELECT USER_NO FROM MEMBER WHERE USER_SSN = ?                                        , SELECT USER_NO FROM MEMBER WHERE USER_SSN = ?                                        , SEL.. 2024. 9. 23.
[오답] Map 객체가 덮어씌워지는 문제 - 의료진 계정 검색 결과가 여러 행인 경우, 마지막으로 검색된 데이터로 다 덮어씌워지고 있다.     - DoctorDao.java는 이렇게 작성되어 있다. - 요청시 넘어온 진료과 값이 '전체' 일경우 조건 없이 select 하고, 특정 진료과 값이 있다면 그 값을 조건으로 select 한다.- 쿼리를 실행한 결과를 doctor, member 두 vo 객체에 나눠 담는다.- 두 vo 객체를 Map 객체에 담는다. "doctor"라는 key 값을 제시하면 Object로 형변환된 Doctor 객체가 나오고,"member"라는 key 값을 제시하면 Object로 형변환된 Member 객체가 나온다. - 서블릿에서 응답페이지로 이동시키면서 이동 데이터로 List> list를 담는다.- jsp에서 > list.. 2024. 9. 22.
[오류] java.lang.Error: Unresolved compilation problem -  java.lang.Error: 해결되지 않은 컴파일 문제: sql 변수를 찾을 수 없습니다   ㅁ 오류 원인  - if 조건문으로 진료과로 '전체'를 선택하면 그냥 쿼리를 실행하고, 진료과로 '외과', '내과', '치과', '안과'를 선택하면 if문으로 sql문에 조건을 추가하게끔 작성했다.- if 블록이든 else 블록이든 변수 sql은 생기는데 왜 오류가 나나 했는데, 블록 내에 선언해서 바깥에선 쓸 수 없었다. - Java에서 변수의 스코프(scope) 규칙. 변수는 선언된 블록 내에서만 접근할 수 있다.if-else 블록 내에서 변수를 선언하면 그 변수는 그 블록 내에서만 유효해서 다른 블록에서 접근할 수 없다.    ㅁ 해결  - 변수 sql을 if~else 블록 바깥에 선언한다.    -.. 2024. 9. 22.
[오류] java.lang.NullPointerException ㅁ manageMember.jsp   - 회원 계정 관리 페이지에서는 db로부터 회원 이름이나 회원 아이디로 Member 테이블에서 회원 정보를 조회해온다.- 그런데 이 페이지로 이동하는 "/manageM.admin" 서블릿을 요청하면 null pointer exception이 발생한다.      ㅁ 오류 원인   -  "/manageM.admin"이라는 url mapping 값을 가지는 서블릿에서 응답 데이터 없이 응답페이지로 이동만 시켜놨다.   %ListMember> list = (ListMember>)request.getAttribute("list");%>    - 그런데 응답페이지인 manageMember.jsp에서는 request로부터 "list"라는 key값을 가지는 Object를 꺼낸다. .. 2024. 9. 22.
쿼리들 ㅁ *-mapper.xml에 쿼리 쓸 때 끝에 ; 없어야 한다.   ㅁ 2_1. 의료진 계정 검색 요청 (이름)  (1) 넘기는 값- 의사명 (2) 가져와야 하는 값- DOCTOR: 사번, 이름,  면허번호, 진료과, 입사일- MEMBER : 주민등록번호,  전화번호, 주소 (3) 쿼리 SELECT DOCTOR_NO, DOCTOR_NAME, LICENCE_NO, DEPT_NAME, HIRE_DATE, USER_SSN, PHONE, ADDRESS FROM DOCTOR JOIN MEMBER USING (USER_NO) WHERE DOCTOR_NAME=? ; (4) 쿼리 예시 SELECT DOCTOR_NO, DOCTOR_NAME, LICENCE_NO, DEPT_NAME, HIRE_DATE, USER_SSN, .. 2024. 9. 20.
modal이 바로 열렸다 닫힘 ㅁ modal이 바로 열렸다 닫힘- '추가용 modal', '삭제용 modal', '수정용 modal'이 있다.- 그런데 '수정용 modal'은 정상적으로 뜨는데 '추가용 modal', '삭제용 modal'은 열리자마자 바로 닫히는 현상이 발생.이전까지 잘 되다가 갑자기 이런다.  - 원인 : form 요소의 action 속성이 비어 있는 경우에 발생합니다. 이 상황에서 모달이 열리자마자 폼이 제출되면서 모달이 닫히는 것이 원인일 수 있다.(html 화면구현 파일이라 비워놨었다)  - 해결 : form 요소의 action 속성에 #을 줬더니 해결됐다. 2024. 9. 13.
DB 피드백 ㅁ 수정 전        ㅁ 피드백    (피드백 1) 회원테이블 ㅡ 법정대리인이름추가(null) 의료진 ㅡ 면허번호컬럼추가 로그인시 사용자,의료진,관리자 나누어지고 마이페이지 이동시 마이페이지,의료진페이지,관리자페이지 이동 의료진테이블안에 진료과추가(매번 조인하기가 번거로움),진료과위치도 추가 근무일정 ㅡ 관리자측에서 신규의료진 등록시 근무일정 테이블도 같이 insert 진행하기 (의료진쪽에서 근무일정 등록시 update진행) 고객의소리 ㅡ 칭찬직원,부서 컬럼추가(null허용) 회신여부 컬럼추가 고객의소리답변 ㅡ 고객의소리 테이블에 합치기 답변자번호,답변일(null허용) 건강검진예약내역 ㅡ  기업번호 not null에서 null로 변경 희망검진일(varchar2) 희망내원시간(오전/오후) 예약일(db에.. 2024. 9. 13.
이미지 안보임 ㅁ header.jsp를 html로 바꿨을 때 이미지가 엑박으로 뜨는 문제 (경로 문제)    - 팀원에게 "header.jsp"를 받아서, body 태그 안의 header start ~ header end 부분을 복붙해서"관리자홈.html"로 화면구현을 하려하는데 이미지가 보이지 않는다. - 생각해보면 이클립스로 프로젝트를 만들고 올리기 전 테스트할 때도, 이미지가 안보여서 이미지 경로를 바꿨었다.그때 저렇게 "/vita/assets/image/vp마크.png"로 바꿨었다.     - 화면구현할 때는 context path를 사용한 절대경로로 이미지 파일 경로를 주지않고다시 상대경로로 바꾸니 이미지가 보인다. 2024. 9. 12.
피드백 (p.79) 피드백1. 기업 건강검진 연계기업 목록을 관리자가 추가/삭제하는 기능 - 추가하겠습니다. (p.79) 피드백2. 예약관리 상세페이지 - 상세페이지 없이, 예약 관리 페이지에서 예약체크사항이 보여지게 추가하겠습니다. (p.80) 피드백3. 관리자의 예약 추가 - 전화로 예약 받으면 관리자가 추가하는 기능입니다.  - 건강검진 예약은 회원이어야만 가능하도록 하겠습니다. 그래서 고객 ID는 필수로 받겠습니다. - 예약 체크사항은 병원 방문시 수기로 입력받겠습니다. (p.83) 피드백4. 진료과 - 진료과는 4개 고정이며, 따로 추가하거나 삭제하지 않습니다. (p.85) 피드백5. 의료진 계정 - 의료진 계정은 관리자가 만들어서 줍니다. - 관리자가 의료진 계정 추가시, 의료진 ID와 비밀번호 입력.. 2024. 9. 7.
DB 설계 ㅁ 회원 테이블 - 아이디, 이름, 주민등록번호, 주소, 핸드폰번호, 회원가입일 - 회원번호 ㅁ 의료진 테이블 - 사번, 이름, 주민등록번호, 진료과, 면허번호, 전화번호, 주소, 입사년도 ㅁ 진료 예약 내역 테이블 - 진료과, 의료진, 날짜, 예약시간(오전/오후), 이름, 핸드폰번호 ㅁ 건강검진 예약 내역 테이블 - 날짜, 예약시간(오전/오후), 예약번호, 회원번호, 이름, 핸드폰번호, 검진유형(일반 건강검진(개인), 기업 건강검진(특수) ㅁ 관리자 테이블 - 데이터 하나 - 아이디, 비밀번호, 관리자번호 ㅁ q&a 답변 테이블 - q&a 게시글 번호, 제목, 글쓴이, 작성시간,  - 답변 내용  ㅁ 공지사항 테이블 - 번호, 제목, 글쓴이, 날짜, 조회수, 내용  = 이름, 핸드폰번호등은 이미 회원 .. 2024. 9. 5.