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

: 두 테이블을 연결할 때 내부 조인이 가장 많이 사용됩니다. (교집합)
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';

내부조인은 구매한 기록이 있는 회원들만 출력됩니다. 구매 테이블에 없는 전체 회원들까지 출력하고 싶으면 외부 조인을 사용해야 합니다.
: 외부 조인은 두 테이블을 조인할 때 필요한 내용이 한쪽 테이블에만 있어도 결과를 추출할 수 있습니다.
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 문의 의미를 ‘왼쪽 테이블의 내용은 모두 출력되어야 한다’ 정도로 해석
외부 조인의 활용
회원 가입만 하고 한번도 구매한적이 없는 회원의 목록을 추출 하려면
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

: 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인시키는 기능입니다.
상호 조인 결과의 전체 행 개수는 두 테이블의 각 행의 개수를 곱한 수만큼 됩니다.
SELECT *
FROM <첫 번째 테이블>
CROSS JOIN <두 번째 테이블>

: 자체 조인은 자기 자신과 조인하므로 1개의 테이블을 사용합니다.
별도의 문법이 있는 것은 아니고 1개로 조인하면 자체 조인이 됩니다.
SELECT <열 목록>
FROM <테이블> 별칭A
INNER JOIN <테이블> 별칭B
ON <조인될 조건>
[WHERE 검색 조건]

// 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 가 남아있었음.