Spring32 네이버 로그인 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. 네이버 로그인 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. 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. @어노테이션을 이용한 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. 어노테이션으로 의존성 주입 과거 생성자,setter를 활용한 의존주입(DI) 변경 => @Component//new @Component("apple")//new id 이기 때문에 다른곳에있으면안됨 변경 => Q. 오토 와이어 에서 필요한 워치가 애플워치인지 어떻게 알았나? @Autowired는 "메모리의 자료형(타입)"을 인지하고 연결해주는 역할을 수행함 하지만 갤럭시도 사용하면 자료형을 인지하기때문에 같은 타입이 여러개면 안된다 - 모호성 이유 문제 해결방안 컴포넌트에 반드시 이름을 주는것 @Qualifier() -로 연결 워치가 여러개구나을 알수있다 2024. 3. 7. .xml에 설정들이 많아진다면? .xml에 설정들이 많아진다면? 너무 무거워진다 실수가 발생할수도있다 -> 싱글톤 깨질 가능성있음 -> 개발자에게 부담이됨..ㅠㅠ -> .xml에 작은 에러라도 발생한다며느, 프로그램이 실행 xxx 불리한이유 개발자가 보기불편 가독성이 너무 않좋음 너무 중요한 파일이라서 ㄴ자주 건들이면 안된다 | 스프링에서 과도한 설정을 줄여주기위해 @(어노테이션)기능을 개발함 ^▽^// 현재 사용하는 스프링은 .XML+ @ 부트는 @ 위주로 실행 @은 개발자 가독성 증가 + .xml 로의 접근을 줄여줌 -> .java에 작성함 개발자가 보는 자바코드에 @을 걸어놓기 때문에 자바코드와 설정을 개발자가 한번에 확인할수있음 자바코드에만 접근하면 되니까 .xml 을 덜 열어봄(오류확률 낮아짐) 2024. 3. 6. factory 연습 -의존성 설정 파일로 주입 결합도 포스팅때 사용했던 코드를 사용하여 연습 ---- 갤럭시 폰에 갤럭시 워치 주입해주시고 주입할때 생성자 주입해주세요 --- 아이폰에 애플워치 setter주입해주세요 package test; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.GenericXmlApplicationContext; public class User02 {//Client(브라우저) public static void main(String[] args) { //팩도리를 new //팩토리를 통해 LookUp: 객체를 호출 //호출된 객체를 사용 AbstractApplication.. 2024. 3. 5. 설정파일 .xml 스프링 클래스 패스 경로가 src/main/resources경로임 .xml생성 xml의 문서를 인코딩해주는 코드 현재 컨테이너 버전과 스키마 버전이 같아야한다 컨테이너가 스키마를 보고 웹에서 자원을 끌고옴 2024. 3. 4. 스프링 프레임워크 컨테이너 1. 톰캣: 서블릿 컨테이너, 웹서버, 내장되어 있음 servlet 클래스를 new 해줌 FrontController등 톰캣 web.xml 2. 스프링 컨테이너 : POJO 클래스를new 해줌 DAO, DTO,Action(Controller)등 코드 내에서 new 역할을 담당하는 컨테이너 스프링 applicationContext.xml 3. 루트(최상위) 컨테이너 : .jar(라이브러리)를 관리해줌 얘도 스프링 컨테이너라고 부름...ㅎㅎ;; 그래서 무슨 컨테이너인지 판단을 잘해야한다 외부 라이브러리다 면 얘 설정 관련 컨테이너 웬만하면 이 녀석을 말함 루트 pom.xml 회사내 자체 제작으로 더 많이 만들수도있음 컨테이너가 동작을 하려면 설정파일을 필요로합니다 .xml 개수로 컨테이너의 개수를 알 수 있.. 2024. 3. 3. Spring 파일생성 create a project 로 프로젝트를 만든다 spring을 검색하면 2개가 나오는데 밑에 starter를 선택한다 maven 자바 기반의 spring 라이브러리 gradle ->boot방식 jar 자르 아카이브 war web group 프로젝트 징행하는 담당 파트 회사 package -> 이름도 group이름+ name Depandencies JDBC spring web 오라클과 MySQL 같이 넣으면 드라이버끼리 모호성 이슈발생 MySQL은 비어있어서 뺌 스프링 프레임 워크에서는 클릭하면 해당 라이브러리들을 알아서 주입해줌 다만 MySQL or 최신 라이브러리들은 개발자가 추가로 설정해야할 수도 있음 그리고 생성 생성중 건드리면 안됨 2024. 3. 2. Spring DI 1) DI 란? Dependency Injection 의존 주입 개발자 -> Spring 컨테이너(Spring 프레임워크) 1. 객체를 생성 및 관리(호출시 해당 객체 메서드 수행) 2. 의존 주입 의존성이란? 어떤 메서드를 수행할때에 다른 객체를 미리 new해야하는 상황 1.생성자 주입(Constructor Injection) private AppleWatch appleWatch;//의존 관계 public IPhone() {//의존 주입 appleWatch=new AppleWatch(); } new를 없에야하기 때문에 외부에서 받아온다 public IPhone(AppleWatch appleWatch) {//의존 주입 생성자 주입 this.appleWatch=appleWatch; System.out.pr.. 2024. 3. 1. Spring 설치 https://spring.io/ Spring | Home Cloud Your code, any cloud—we’ve got you covered. Connect and scale your services, whatever your platform. spring.io Projects -> Spring Tools 4 Spring Tools 4 for Eclipse 4.21.1-windows x86_64 다운 아무것도 건들이지 않고 resource로 가져오기 가져와서 더블클릭하면 -> 파일 생성 워크 스페이스 따로 파기 실행하기 경로지정하면 끝 2024. 2. 29. <bean> 이란? ★new를 대신해주는 태그 ★ 결합도가 낮아집니다! Phone phone =new Phone(); handler=new HandlerMapper(); mappings.put("/main.do", new MainAction()); >> new MainAction() 규칙 1. id 값은 중복허용 xxx 규칙 2. 을 통해 new 된 객체들은 Heap메모리 영역에 저장됨 +) 싱글톤을 알아서 해주는 것은 아님 class -> 정확한 경로로 적어야함 6. 싱글톤에 관련된 설명이 제각각일 수 있음 -> 잘 파악해서 정리할것 싱글톤을 알아서 해주는 것은 아님 교재에 "이 싱글톤을 유지해준다." 에러 x 권장 x=> 싱글톤이 유지되지 않음 한번 phone, phone2 객체를 생성했다면 다음에 다른곳에서 p.. 2024. 2. 26. 컨테이너 1. 컨테이너는 설정 파일을 필요로 합니다 .xml 서블릿 컨테이너(톰캣, 웹서버)=> web.xml 2. 스프링 컨테이너 역시 설정파일(.xml)을 필요로 합니다 applicationContext.xml 3. applicationContext.xml 설정파일의 루트엘리먼트 .xml의 구조 .xml 이기때문에 (태그)로 구성됨 루트 엘리먼트(최상위 태그) 각종 설정들이 로 작성 되어있음 4. 각종 설정들을 루트 엘리먼트 안에 (태그)로 작성 1) 2)... 2024. 2. 25. 결합도(Coupling) 결합도(Coupling)에 대하여...(day61) 결합도를 낮추기위한 다향한 개발자들의 노력이 있어왔습니다 1) 인터페이스를 활용하는 방법 => 객체가 변경되어도 메서드를 추가 변경하지 않아도 ㄱㅊ 2) 팩토리 패턴을 활용하는 방법 =>코드에 new가 있었는데, new 가 없어짐 코드에 new 가 없을수록 결합도가 낮은것!! package test; public class User {//Client(브라우저) public static void main(String[] args) { BeanFactory beanFactory=new BeanFactory(); Phone phone =(Phone)beanFactory.getBean(args[0]); phone.powerOn(); phone.call(); p.. 2024. 2. 21. 프레임워크란 프레임 워크를 활용했을때의 장점이 뭔가요? SpringMVC 이미 적용된 프로젝트를 하나 생성해줌 == 구현이 빨라짐 몰라도 쓸수 있다 == 개발자의 실력이 상향 평준화됨 일관성이 유지되기 쉬움 ★유지보수 용이 프레임워크 vs 라이브러리 ▶ 프레임워크 : 일정한 형태와 필요한 기능을 갖추고 있는 골격, 뼈대. 이 뼈대 위에서 개발자는 코드를 작성하여 어플리케이션을 개발함. 코드가 프레임워크에 의해 사용됨 ( IoC 개념 ) ex) Spring ▷ 라이브러리 : 특정 기능을 모아둔 코드, 함수들의 집합. 필요한 기능이 있을 때 라이브러리를 사용하여 코드를 작성 ex) 패키지·모듈, jQuery 2024. 2. 19. Spring 경량 3) 경량이란 무엇인가요? 1. 다루는 객체가 가볍다. == POJO 2. 사용 메모리가 적다. == 싱글톤 패턴을 활용 2024. 2. 17. Spring AOP AOP가 뭔가요? Aspect - Oriented Programming 관점 지향 프로그래밍 OOP(객체 지향 프로그래밍) xx지향 프로그래밍 1) 절차 : 순서대로 진행하는 방식 C언어 일의 처리순서가 가장 중요 알고리즘 성능 - 속도 2) 객체 : 모듈(클래스) 단위로 코드를 구성하는 방식 JAVA 설계, 객체가 중요 학생, 카드, 캐릭터, xxx기능 Action,... 성능 - 메모리(Heap) : 싱글톤, 팩토리,... ----개발팁... ctrl c,v를 하잖아요? 개선할 여지가 있다는 뜻~ ^^ 1)인터페이스 Action DAO류 인터페이스 제작할듯 2)내부로직이 유사한 경우 AOP를 적용해 볼 수 있는 타이밍 db엔 4가지가 있다 insert select 올바른 접근이가? 올바른 접근이가? .. 2024. 2. 16. 이전 1 2 다음