전체 글242 네이버 로그인 view 네이버 로그인 제작시 login.jsp에는 자바 코드로 제작 되어있었다 2024. 4. 11. 네이버 로그인 var.3 var.2 의 경우 하나의 컨트롤러에서 모든 비즈니스 로직이 들어있어서 유지보수가 어렵고 결합도가 높은 코드였습니다 그래서 비즈니스 로직은 서비스로 분리하고 컨트롤러는 네이버 로그인 요청만 처리하도록 했습니다 서비스 계층(추가) (인터페이스 ) NaverLoginService : 회원 관련 작업을 처리하는 메서드 NaverLoginServiceImpl : 실제 비즈니스 로직 구현 컨트롤러 계층(변경) NaverLoginPageController >> NaverLoginController : 네이버 로그인 관련요청 처리 1.네이버 로그인 관련 작업을 분리하기 위해 NaverLoginService 생성 public interface NaverLoginService { String getToken(String.. 2024. 4. 10. js 배열 ajax 를 이용해 컨트롤러에서 받기 function letterRead(){ console.log("읽음 처리"); var checkedLetters =letterArr(); console.log("체크 된거 : "+checkedLetters); $.ajax({ type: "POST", url: "/user/letterCheckRead", data: { "letterCheck": checkedLetters }, dataType: 'json', success: function(data) { console.log(data); }, error: function(error) { console.log('에러발생'); console.log('에러의 종류:' + error); } }); } function letterArr(){ // 체크된 편지 ID.. 2024. 4. 5. 이미지 저장 경로 에러(상대경로) 절대 경로가 아닌 상대 경로로 사용하여 프로젝트가 다른 환경으로 이동하더라도 경로를 변경하지 않기위해 상대경로를 사용했음 하지만 경로에 저장되려고 했지만 해당 경로는 임시 디렉토리이기 때문에 저장을 실패했음 상대 경로를 사용하지 않고 다른환경으로 이동해도 변경되지 않게 하기위해 request.getServletContext().getRealPath("/")를 사용하여 해결함 List fileNames = savePictures.storeImages(files, request.getServletContext().getRealPath("/")); package com.jarvis.BalanceGame; import java.io.File; import java.io.IOException; import jav.. 2024. 4. 4. 이미지 저장 단일 이미지 저장 이미지를 저장하는 html 이다 먼저 input태그를 생성하고 타입을 file 로 설정하고 이미지만 업로드 하기위해 accept를 image/*만 가능하게 했다 그리고 컨트롤러에서 받아보기위해 name을 file로 하였다 그리고 이미지 파일을 전송하기 위해선 multipart/form-data로 설정해야 가능하다 multipart/form-data 는 웹 폼 데이터를 전송하는 데 사용되는 인코딩 방식 중 하나 이 방식은 파일 업로드와 같이 바이너리 데이터를 전송해야 하는 경우에 사용됩니다 package com.jarvis.BalanceGame.controller.user.action; import java.io.File; import java.io.IOException; import j.. 2024. 4. 3. Mybatis [M 파트] 버전 1 JDBC 응집도를 높이기 위해 JDBCUtil 클랫스를 생성 버전 2 "이관 작업" 오라클 => MySQL DBMS를 변경하는 작업 버전 3 JDBCTemplate 템플릿 패턴 복잡하거나 반복되는 작업을 템플릿화 해둔 객체를 사용하는 방법 JDBC 연결로직이 반복이되기때문에 사용 버전 4 MyBatis 프레임워크 자바의 DTO(엔티티,커맨드 객체 ,POJO)와 ㄴsql 수행결과(rs)를 매핑시켜주는 역할을 담당하는 프레임워크 >> RowMapper와 유사한 역할 -> SQL문이 JAVA코드에 작성이 되어있음! ->SQL문에 변셩이 발생되었을떄 ,재컴파일 해야만한다! ->a가 변했는데 b도 변경되는 것 -> 결합도가 높다 응집도가 낮다 ->응집도를 높여야한다! == 파일을 분리해라. .. 2024. 4. 2. 네이버 로그인 var.2 var.1은 뷰에서 데이터를 받아볼 수 있었다 하지만 로그인시 컨트롤러에서 유저 정보를 받아 해당 유저가 회원가입이 되어있는 유저인지 확인 하고 싶었다 그래서 고민을 해보았을 때 1번 방법 : var.1 뷰에서 다시 컨트롤러로 데이터를 전달해 컨트롤러에서 확인하는 방법 2번 방법 : 로그인시 호출 되는 컨트롤러에서 바로 유저 정보를 확인하는 방법이 있었다 1번 방법은 불필요한 클래스가 생기기 때문에 2번 방법을 시도 해보았다 2번 방법을 사용하기 위해선 자바 코드로 데이터를 받아와야했다 그래서 명세서를 찾아보니 jsp로 로그인을 하는 방법을 찾아볼 수 있었다 callback.jsp에 있는 태그 안에 있는 코드는 자바 코드이므로 컨트롤러로 가져와 실험해보았다 login.jsp NaverLoginPageCo.. 2024. 4. 1. 네이버 로그인 var.1 네이버 디벨로퍼 설정 참고 블로그 https://tyrannocoding.tistory.com/60 등록이 완료되면 방금 만든 정보를 볼 수 있습니다 디벨로퍼 설정이 완료된 후 https://developers.naver.com/docs/login/api/api.md 네이버 로그인 API 명세를 보고 만들어 보았다 명세에 있는 html 예제를 사용하여 만들어보았다 위 코드를 넣고 싶은 부분에 넣는다 YOUR_CLIENT_ID : 아까 만들었던 디벨로퍼 Application에서 Client ID를 넣고 YOUR_CALLBACK_URL : 데이터를 받아 볼 URL를 넣는다 YOUR_SERVICE_URL : 사용할 URL를 넣는다 naver_id_login.setDomain("http://localhost:8.. 2024. 3. 31. Controller Validation [사용자의 입력값 검증] : 사용자가 입력값을 요청에 넣어서 보냈을때 최소한의 조건을 만족한 값인지 확인하는 Spring의 기본제공기능이 있다 ->유효성 검증 객체 Validator Dependencies 추가 Validaton 1차 MemberDTOValidation implements Validator ->메서드 강제 sopports 에 검증하고 싶은 객체를 확인한다 validate에 확인하고 싶은 유효성을 넣으면된다 target는 Object이기 때문에 다운 케스팅으로 형변환해서 객체에 담아 사용한다 컨트롤러에서 만든 vlidator를 사용해보면 확인 하고 싶은 객체를 인자로 넣고 추가로 에러 내용을 받기위한 BindingResult를 커맨드 객체로 받아 넣어준다 그러면 유효성이 작동되는 것을 확인.. 2024. 3. 30. lombok DTO 제작시 사용할 메개변수를 만들고 나서 항상 getter,setter tostring를 기본으로 가지고 다녀야하는데 자동으로 못만드나 해서 나온 것이 롬복이다 외부라이브러리 사용 -> 롬복 https://projectlombok.org/download Download projectlombok.org 리소스파일로 이동 외부라이브러리 파일-> 사용할 개발도구에 연결 (설치) 설치 이후의 프로젝트에만 적용되며, 설치 이전의 프로젝트에는 적용안 안된다 사용해보기 어노테이션을 달아준다 알아서 생성된것을 확인 할 수 있다 실행 2024. 3. 29. @PathVariable 버전이 높아지면서 보게될 확률이 높아짐 뷰에서 컨트롤러로 데이터를 보내 줄때 Commabd 객체에 다 담기진 않은 객체를 받아올때도 있음 Data는 아니야 test3요청할때 추가로 데이터가 필요해 :Command객체 외에 해당 C메서드에서 필요한 데이터를 V 측에서 전송한 경우 요청 경로에 보냄 V 측에서 전송한 데이터를 C 메서드에서 받기위해 사용하는 @ 메서드 인자에서 받음 @RequestMapping("/test4/{searchCondition}/{seachKeyword}") public String test4(@PathVariable String searchCondition,@PathVariable String seachKeyword, Data data) {//첫요청 //뿌리는 방법 //3.Com.. 2024. 3. 28. V -> C로 데이터 받아오기 var.1 백단과 프론트가 회사가 다를때 사용커멘드 객체를 사용하지 못할때 사용 @RequestMapping("/test") public String test(HttpServletRequest req) {//첫요청 //뿌리는 방법 //1. 백단과 프론트가 회사가 다를때 사용 //커멘드 객체를 사용하지 못할때 String apple=req.getParameter("apple"); String banana=req.getParameter("banana"); Data data=new Data(); data.setApple(apple); data.setBanana(banana); System.out.println(data); return "test"; } var.2 : 어노테이션 사용 @RequestMapping.. 2024. 3. 27. 페이지 요청과 데이터 전달 ★Model 사용 @RequestMapping("/") public String root(Model model) {//첫요청 //data 와 리스트 타입의datas가 필요함 //더 선호 model.addAttribute("data","홍길동"); ArrayList datas=new ArrayList(); datas.add("apple"); datas.add("banana"); datas.add("kiwi"); model.addAttribute("datas",datas); System.out.println("로그"); return "index"; } ModelAndView 사용 public ModelAndView root2(ModelAndView mav) { mav.addObject("data","홍길동".. 2024. 3. 26. javax.servlet.jsp.tagext.TagLibraryValidator 기존 방식대로 사용했지만 에러가 발생했다 jstl 버전에 문제가 있는 걸 확인했다 그래서 확인해보니 3.0버전에선 아래와 같은 implementation 를 사용하고 implementation 'javax.servlet:jstl' 3.0이상부턴 implementation 'jakarta.servlet:jakarta.servlet-api' implementation 'jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api' implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl' 사용해야했다 gradle를 변경한뒤 를 하고 실행했다 하지만 동작이 되지않았다 생각해보니 jstl를 사용하기위해 해당 .jar.를 넣었던 .. 2024. 3. 25. Spring Boot 파일 확인해보면 잘 생성이 된걸 확인할수있다 src/main/java - MC(모델, 컨트롤러) src/main/resources - application.properties : 컨테이너가 봐야하는 설정을 알려주는 공간, 프로젝트 전테설정에 필요한 정보 보관함 static : 정적 웹리소스틀이 저장되는 공간 ex) html,css,js.. 이미지? 별도의 컴파일/ 파싱등이 불필요한 파일들 src : "동적" 우베 리소드들이 저장되는 공간 ex)JSP maven의 pom.xml역할 == build.gradle 라이브러리들(.jar파일들) 기본제공x 의존성 주입해야한다 implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' implementation 'java.. 2024. 3. 24. Spring Boot 파일 생성 프로젝트 생성 new -> Spring Starter Project 해당 화면이 나온다 Type을 변경한다 next > 를 클릭 웹을 할것이기에 골라서 넣은뒤 생성! 잠시 기다린뒤 포트번호 설정 2024. 3. 23. Controller Command객체 스프링이 지원하는 컨트롤러에서 스프링이 지원하는 어노테이션으로 변경하게 되면서 @Controller 인터페이스가 아니므로 메서드 시그니쳐 강제성이 사라졌다 output을 다시 String를 사용할 수 있게되었다 그리고 컨트롤러 에서 과거에 req,res를 인자로 가졌는데 HttpServletResponse,HttpServletRequest 때문에 완전한 POJO는 아니었다 그래서 import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; 를 제거해야했는데 사용자의 입력한 값들을 보관하는 역할의 req는 꼭 필요했다 이를 대신할 방법은 DTO로 받아올 수 있는 방법이 있다 이러한 류를 Comm.. 2024. 3. 22. ViewResolver 모음 버전01 개발자가 직접만든 VR사용 DI로 setter 주입사용 버전 02 Spring 프레임워크에서 제공하는 VR사용 org.springframework.web.servlet.view.InteralResourceViewResolver DI로 setter 주입을 사용 특정페이지의 URL을 알면 별도의 권한이 없어도 접근이 가능한 경우가 있다 이 경우를 막기 위해서는 C 파트에서 별도의 접근 권한 유효성 검사를 구현 해야만한다 Spring 에서는 애초에 페이지를 WEB-INF폴더에 은닉(하이딩)하여 저장한다 WEB-INF폴더의 하위는 오직 VR를 통해서만 접근이 가능함을 이용한것 mav.setViewName("test"); VR가 /WEB-INF/views/test.jsp 은닉된 페이지에 접근 가능해짐 2024. 3. 21. HandlerMapping 모음 버전 01 개발자가 직접만든 HM 사용 DI로 생성자 주입을 사용 public class HandlerMapping { private Map mappings; public HandlerMapping() { mappings=new HashMap(); mappings.put("/login.do", new LoginController()); mappings.put("/main.do", new MainController()); } public Controller getController(String commend) { return mappings.get(commend); } } 버전 02 Spring 프레임워크에서 제공하는 HM을 사용 org.springframework.web.servlet.handler.Si.. 2024. 3. 20. Controller(Action) 모음 버전 01 개발자가 직접만든 Controller 인터페이스 사용 output이 ActionForward 이었는데 VR 가 등장하면서 String으로 변경됨 String 유무로 VR 있는지 알수있다 어디로(경로),어떻게(방식 : 리다이렉트, 포워드) // Action public interface Controller{ // ActionForward → String String execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException; } // ActionForward 가 필요없어짐! public class ViewResolver { public String prefix; publi.. 2024. 3. 19. SpringMVC 구조 개념 스프링에 오면서 명칭이 바뀐 친구들이있다 MVC2 핵심 FC 그러면 .xml(설정파일 ) 이 필요한다 어노테이션 없어서 어노테이션 대신에 설정파일로 만듬 web.xml private HandlerMapper handler; HandlerMapper 클래스 만듬 Action을 스프링에서는 Controller라고 부름 ActionForward 를 사용했었다(어디로 가야할지) -> ViewResolver가 대신함 ActionForward 가 (ViewResolver)를 사용해서 String으로 간소화 되었다 동작 순서 사용자 (브라우저,Client) 요청 요청정보를 FC(DS)에서 받아서 요청정보를 꺼내요 요청에 맞는 Action(Controller)을 수행하는데 이때 활용하는게 HM Action을 수행하면 .. 2024. 3. 18. DispatcherServlet 모음 버전 01 개발자가 직접만든 DispatcherServlet사용 com.spring.controller.common.DisspatcherServlet com.spring.controller.common.DispatcherServlet package com.spring.controller.common; import java.io.IOException; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; // FrontController // .. 2024. 3. 17. 트랜잭션 외부에서 클래스를 받아오는 것이라 xml를 사용 .xml 설정으로 걸고 사용을 하는것이 보편적이다 .xml(설정파일) 에서 트랜젝션을 사용하기 위해선 추가해야할 두 가지가 있다 xmlns:tx="http://www.springframework.org/schema/tx" http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd 트랜잭션 사용 트랜잭션 설정해주는 것은 DataSourceTransactionManager id="txManager"로 많이 사용한다 ->setter주입을 필요로한다 -> dbcp 주입 ->공통로직 (어드바이스)로 봄 어드바이스 등록 모든 트랜젝션 처리 name=.. 2024. 3. 16. DAO var.2 사용 insert,update,delete를 먼저 제작 JdbcTemplate 를 사용해서 제작 jdbcTemplate.update()-> MemberDao의 맴버변수이다 jdbcTemplate는 insert,update,delete jdbcTemplate.update 하나로 수행한다 int rs=pstmt.executeUpdate(); 이거랑 비슷한느낌 public boolean update(MemberDTO mDTO) { //얘가 MemberDao의 맴버변수이다 int result=jdbcTemplate.update(UPDATE,mDTO.getMid(),mDTO.getPassword(),mDTO.getName(),mDTO.getRole()); //jdbcTemplate는 모두 업데이트로 수행한다 //int.. 2024. 3. 15. DAO var.1 -> DAO var.2 설정 JDBCTemplate 을 활용한 버전업 JDBCTemplate : 템플릿 패턴을 활용한 클래스 반복되는 JDBC의 로직을 캡슐화한 클래스 : 기존 DAO 에 템플릿 패턴을 활용한 클래스를 구현해서 가독성 증가 템플릿 패턴이란? 반복되는 로직이나 복잡한로직을 캡슐화한 클래스 내용이 반복이 되니까 패턴화 한것이다 insert,update,delete는 결이 같으니 JdbcTemplate 를 사용해서 먼저 제작 JdbcTemplate 를 사용하기 위해선 MemberDao의 맴버변수로 선언해야한다 private JdbcTemplate jdbcTemplate;//맴버변수는 의존관계이다 -> DI(의존주입) @Autowired 를 사용 -> @Autowired는 만능이 아니다.. 메모리에 로드 되어있어야 가능하다.. 2024. 3. 14. FileNotFoundException org.springframework.jdbc.core.JdbcTemplate을 사용하기위해 템플릿 의존주입을 위한 템플릿 new => 을 하는데 파일이 없다는 에러가 발생했다 pom.xml에 jar 추가로 에러를 해결하였다 2024. 3. 13. @어노테이션을 이용한 AOP 모든 xml 설정은 @ 으로 바꿀 수 있다 를 하게 되면 aop를 @으로 변경 먼저 Pointcut 을 클래스로 만든다 package com.spring.biz.common; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; @Aspect public class PointcutCommon { @Pointcut("execution(* com.spring.biz..*Impl.*(..))")//추상 아님 비어있는 깡통 public void aPointcut() {} @Pointcut("execution(* com.spring.biz..*Impl.select*(..))") public void bPoint.. 2024. 3. 12. Advice 동작시점 어드바이스 동작시점 애스팩트(결합,위빙)설정할때 함께 설정함 before : 비즈니스 메서드 수행전 =>일반 로그,반환이 있는거랑 엮는다 보통 select after : finally, 비즈니스 메서드 수행후 예외가 발생하던 말던 수행 after-returning : 비즈니스 메서드 return 반환 후 => 예외가 발생하지 않고 리턴 되었을때 after-throwing : catch,비즈니스 메서드 예외 발생시 around : 비즈니스 메서드 수행 전후로 접근가능 핵심로직의 성능 평가 before after-returning after-throwing around aop를 잘 사용하면 로그를 직접 작성하지 않고 사용할수 있다 2024. 3. 11. AOP 정리 AOP 비즈니스 메서드(비즈니스 로직, 핵심 관심, CRUD)에서 횡단 관심 (공통 로직)을 분리 관심 분리(Separation of Concern) C : 인증 로깅 C 트랜잭션 예외처리 R : 로깅 R U : 인증 로깅 보안 U 트랜잭션 예외처리 D : 인증 로깅 보안 D 트랜잭션 예외처리 공통 로직이 있다 횡단 관심 지금까진 한번에 처리했지만 다른파트에서 사용하는 것이 있다면 분리해서 관리를 하겠다 : AOP의 시작 로직(관심)들끼리 코드를 관리 -> 높은 응집도를 보장할 수 있다 진행순서 항상 찍는 로그는 공통 로직이네? Advice 클래스로 분리 == 관심 분리 Advice(공통로직을 뜻함) Advic를 Service의 멤버변수로 설정 멤버변수로 설정하면 무엇이 발생하냐? 의존관계 발생 뭔가 맴.. 2024. 3. 10. Spring 어노테이션을 이용한 연습 DTO, DAO -> MODEL 파트 cotroller 파트 | Spring은 AOP를 지원함 CRUD(핵심기능)/공통로직(횡단기능) DAO의 기능을 별도로 사용하는 Service를 제작 Service가 DAO도 사용할수있고,Common도 사용할수있다 Controller(Action) -> 직접DAO사용 Controller(Action) -> Service라는 객체를 통해서 DAO를 사용 Service가 DAO,공통로직 골라서 선택적으로 사용 Watch Phone 처럼, Service의 메서드 시그니쳐와 DAO의 메서드 시그니쳐가 같으면 사용에 용이함이 있다 서비스 개발중인데 레포지가 없나봐요 Null떠요 DAO가 new가 되어있지 않다 2. 1를 누르면 로그인 3. 2을 누르면 글 작성 4. 3를 누르.. 2024. 3. 9. 이전 1 2 3 4 5 ··· 9 다음