본문 바로가기

자바 웹을 다루는 기술

[DI]

 

final private Vehicle vehicle ; - > 런타임중 변경되는 것을 미연에 방지

이를 controller의 service 객체나 service의 DAO 객체에 사용한다.

 

--단. private이라고 해서 논리에 상관 없이 getter/setter를 제공하면 쓰레기 코드다  내 정보를 전부 오픈하는 꼴이다.

 

 

 

강한결합도

한 상황에만 적용되어 끝내는거 확장성 낮음

느슨한 결합도

인터페이스 객체를 통해서 외부에서 객체를 생성해 사용하는것

 

 

 

https://velog.io/@gillog/Spring-DIDependency-Injection-%EC%84%B8-%EA%B0%80%EC%A7%80-%EB%B0%A9%EB%B2%95

 

[Spring] DI(Dependency Injection) 세 가지 방법

앞서 DI(Dependency Injection)에 대해서 알아보았는데, Spring에서 의존성을 주입하는 세 가지 방법에 대해서 다루어 보려고한다.DI는 Spring에서만 사용되는 용어가 아니라 객체지향 프로그래밍에서는

velog.io

생성자를 통해서 주입하는게 최근 방식 : 런타임중에 변경하지 않는다.

인터페이스의 구현체를 객체 생성시에만 받겠다 런타임중에는 변경 불가!!!

 

@Autowired  - 스프링에서 필드 ,생성자, setter를 통해 의존성을 주입하는 방법

필드랑 생성자는 런타임중 변경될 수없음 , setter -변경될 수있음

 

- service에 변수에 의존성 주입하기  -> 내부의 의존성주입에는 신경쓰지 않고 비즈니스로직에만 집중할 수있다.

1. Controller 클래스의 service 멤버 변수 설정 (DI) 

2. Interface DAO에 대한 구현체 DI 설정

-> 상속관계를 이용

3. mime :(Content-Type : Application/x-www-form-urlencode): get/post의 일반적인 전송시 Controller의 메소드의 인자로 DTO객체를 전달 할 수 있게 기능 추가

Member member = new Member();

member.setUid("uid");

.

.

.

Board board = new Board();

board. setTitle("title");

.

.

.

.

이런 과정들을 프레임워크 내부에서 해줌 넘겨주기위한 객체 생성같은거 걍 매개변수로 받아오기만 하면돼

4. post ,mime :(Content-Type : Application/json) Controller의 메소드의 인자로 DTO객체를 전달 할 수 있게 기능 추가

 

5. 결과를 리턴시

     jsp로 리턴

     redirect로 리턴

     json 문자열로 리턴 - > fetch!!

 

 

 

@Conponent 등등을 설정하면 정보를 저장하게 되는 데 Map에 객체와 클래스와 method를 담아두던 것과 동일하다

 

 

 

쌩코딩

DI직접구현

1. classMap에서 클래스 정보를 읽는다.

2. 클래스 정보중 필드 목록을 얻는다.

3. 필드 목록 중에서 필드의 타입을 확인하여 objectMap에 객체가 존재하는지 확인하여 값이 존재하면 설정한다.

 

 

 

--여기까지가 Controller의 service멤버변수 설정(DI)

 

DAO 구현체를 주입

 

1. 필드의 타입이 인터페이스 인지 확인한다.

2. objectMap에 있는 객체 중 인터페이스로 형변환이 가능한지 확인한다.

3. 확인이 되면 해당 객체를 field에 대입한다.

 

field.getType().isInterface() - > 해당 필드가 인터페이스 인지 확인가능!

objectEntry.getValue().getClass().asSubclass(field.getType()); --타입이 일치하는지 확인 일치하지 않으면 형변환 불가하다느 Excetion 반환한다.

 

--Interface DAO에 대한 구현체 DI주입

 

매개변수가 3개인것에 대한 예외처리

method.getParameterCount() 했을 때 함수의 매개변수 갯수가 나오는데 이게 3개라면 , 2개라면 다른 방식의 처리를 수행한다.

첫번째에 대한 type 정보를 얻어온다.

class paramClass = method.getParameterTypes()[0]

//위에서 받아온 타입에 대한 객체 생성

Object paramObj = paramClass.getDeclaredConstructor().newInstance();

request.getParameterMap() - > 키값쌍으로 파라미터를 받아온다. input태그의 name이 key

이제 controller 쪽에서 getParameter를 할 필요가 없다.!

 

--Mime 전송방식 1번 끝

input태그로 받아온 애를 int형으로 형변환해서 가져오자

field.getType().equals(int.class) - > int형이면

Integer.parseInt(파라미터); 해주기

배열도 처리해보자!

 

F12  - > network - > t실행 - > header

-> 날아간데이터 확인 payload

->row데이터 확인 view source

 

fetch로 데이터를 보내보자!!!

json!

<input type="button" value="fetch등록1" onclick="fetchTest1()"/>

function fetchText1(){



}

document.querySelector("#fetch2").addEventListener("click", e => {
	
    const param = {
    	
    
    }



});

함수 만들기 전에는 없다 ! 200번! -> 근데 이게 정상 요청이네;;?ㅋㅋㅋ

 

 

controller에서 클라이언트로 json데이터를 보낸다.

json.toString()

 

request.getInputStream() -> iso-88591로 들어오는애를 utf-8로 바꿔줘야함

P794

BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream(),"utf-8"));
StringBuilder data = new StringBuilder();
String line = null;
while(true){
	line = br.readLine();//한줄씩 읽어들인다.
    if(line == null) break;
    data.append(line);

}
//json객체 생성
JSONObject jsonObject = new JSONObject(data.toString());

 

배열은 어떻게 받지

getJSONArray()

 

브라우저에서 인코딩이 깨질때 java에서 보낼때 인코딩을 변경해 주어야한다.

response.setCharacterEncoding("utf-8");

response.setContentType("application/json; charset=UTF-8");

 

회원 관리 함수 실행 과정

 

form에서 엔터쳤을때 서버로 안넘어가게 하려면 

onsubmit="return false;"

두사람이 동시에 데이터베이스에 회원정보를 등록해서는 안된다.

이를 수행하려면 쿼리 실행 직전에 실행해야할 코드

conn.setAutoCommit(false); - >트랜잭션 시작

int count = pstmt.executeUpdate(); --> 쿼리 실행후

conn.commit(); --> 커밋

 

 

service는 하나의 함수만 띄워서 실행 할 수 있어야한다. -> main함수 하나만으로 실행할수 있어야한다.  다라서 http 관련 변수가 있으면 안된다. service에 있는함수에는 session같은거 넣지 말자

 

 

 

로그인할때 비밀번호를 ??물어보는걸 impl에서 실행한다

 

 

loginMember.getPwd().equals(member.getPwd()) - >이렇게 해서 하는 건 별로..직관적이지 않다. 그래서 Member 클래스 내에 비밀번호를 비교해주는 함수를 만든다

루트부터 안쓰면 현재위치기준이기때문에 이를 ㅁ방지하기 위해서 이런식으로 사용해준다. 앞에 context명과 page명 까지 나온다

문자열 치환까지!!