TIL : 230111

JINSEON YE·2023년 1월 11일

TIL

목록 보기
54/88

SQL

JOIN

두개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 것입니다.

  • 일대다관계
  1. 각 회원은 구매를 여러번 할 수 있습니다.
  2. 블랙핑크(BLK)는 회원테이블에는 1개, 구매테이블에는 여러개가 있습니다. (일대다 관계)
  3. 회원 테이블의 PK가 구매테이블에 FK로 들어가 있습니다.

내부 조인 (INNER JOIN)

: 두 테이블을 연결할 때 내부 조인이 가장 많이 사용됩니다. (교집합)

  • 내부 조인의 형식
SELECT <열 목록>
FROM <첫 번째 테이블>
	INNER JOIN <두 번째 테이블> -- INNER JOIN은 'INNER' 생략가능
	ON <조인될 조건>
[WHERE 검색 조건]

ON : 대조할 조건

SELECT *
	FROM buy
	JOIN member
	ON buy.mem_id = member.mem_id
WHERE buy.mem_id = 'BLK';

내부조인은 구매한 기록이 있는 회원들만 출력됩니다. 구매 테이블에 없는 전체 회원들까지 출력하고 싶으면 외부 조인을 사용해야 합니다.

외부 조인 (OUTER JOIN)

: 외부 조인은 두 테이블을 조인할 때 필요한 내용이 한쪽 테이블에만 있어도 결과를 추출할 수 있습니다.

  • 외부 조인의 형식
SELECT <열 목록>
FROM <첫 번째 테이블(LEFT 테이블)>
	<LEFT | RIGHT | FULL> OUTER JOIN <두 번째 테이블(RIGHT 테이블)>
	ON <조일될 조건>
[WHERE 검색 조건];
SELECT M.mem_id, M.mem_name, B.prod_name, M.addr
	FROM member M
		LEFT OUTER JOIN buy B
		ON M.mem_id = B.mem_id
	ORDER BY M.mem_id;

LEFT OUTER JOIN 문의 의미를 ‘왼쪽 테이블의 내용은 모두 출력되어야 한다’ 정도로 해석

  • 외부 조인의 활용

    • prod_name 이 NULL인 회원은 아직 구매한 이력이 한번도 없는 회원 입니다. 실제 상황이라고 생각하면 이러한 회원을 추출해 구매 촉진 이메일 등을 보낼수가 있습니다.
  • 회원 가입만 하고 한번도 구매한적이 없는 회원의 목록을 추출 하려면

SELECT M.mem_id, M.mem_name, B.prod_name, M.addr
	FROM member M
		LEFT OUTER JOIN buy B
		ON M.mem_id = B.mem_id
	WHERE B.prod_name IS NULL
	ORDER BY M.mem_id

상호조인 (CROSS JOIN)

: 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인시키는 기능입니다.
상호 조인 결과의 전체 행 개수는 두 테이블의 각 행의 개수를 곱한 수만큼 됩니다.

 SELECT * 
 FROM <첫 번째 테이블>
           CROSS JOIN <두 번째 테이블>

자체조인 (SELF JOIN)

: 자체 조인은 자기 자신과 조인하므로 1개의 테이블을 사용합니다.
별도의 문법이 있는 것은 아니고 1개로 조인하면 자체 조인이 됩니다.

SELECT <열 목록>
 FROM <테이블> 별칭A
          INNER JOIN <테이블> 별칭B
          ON <조인될 조건>
 [WHERE 검색 조건]

Spring

HttpServletResponse

  • 역할
  1. HTTP 응답 메세지 생성
  2. 응답 코드 지정 (200,300,400,500 등)
  3. 바디 생성 가능
  4. 여러 편의 기능 제공 (Content-type, Cookie, Redirect)
// header에서 토큰을 가져오기
    public String resolveToken(HttpServletRequest request) { //HttpServletRequest 안에 우리가 가져와야 될 토큰이 header에 들어있음.
        String bearerToken = request.getHeader(AUTHORIZATION_HEADER); //request.getHeader()을 하면 그 안에 있는 header 값을 가져올 수 있는데, 거기에 파라미터로 어떠한 키를 가지고 올지 넣어주면 된다. AUTHORIZATION_HEADER에 들어있는 토큰값을 가져오는 코드
        if (StringUtils.hasText(bearerToken) && bearerToken.startsWith(BEARER_PREFIX)) { //그렇게 가져온 코드가 있는지, bearer로 시작하는지 확인
            return bearerToken.substring(7); //토큰과 연관되지 않은 string을 떼어낸 후 반환.
        }
        return null;
    }

에러메세지

로그인 기능을 구현한 후 postman에서 실행해보는데 delete만 500에러가 뜨면서 안 됨.
에러 : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class jakarta.servlet.http.HttpServletRequest]] with root cause ...
문제 : 쿼리값이 잘 주입되었는지, db가 run 중인지, 인스턴스 변수가 제대로 의존성 주입이 되었는지 등의 문제로 야기된다고 함.
해결 : deleteBoard로 타고 들어가서 BoardController에 들어가니 쓸모없는 @RequestBody 가 남아있었음.

profile
백엔드 개발자

0개의 댓글