Backend

Backend/Java

Spring Security JWT Token

서론 스프링 시큐리티 볼 때마다 이해하는데 시간 엄청 들이고 넘겼는데, 다시 만나면 제자리다...ㅠ 이번에 프로젝트 샘플코드를 복습하면서 블로그에 정리하려 한다. Session HTTP의 기본적인 상태는 Stateless(무상태), 즉 아무 정보도 저장하지 않는다. request를 같은 사용자가 하더라도, 할 때마다 누가 누군지 모른다는 것이다. 하지만 실제로는 대부분의 웹사이트가 그렇게 작동하지 않는다. 로그인하면 한동안 로그인이 유지되어 있고, 장바구니 같이 회원이 누군지 알아야만 서비스 할 수 있는 기능도 있다. 이를 위해 보통 로그인시 서버 세션에 회원의 정보를 저장해놓고, 요청과 응답에 회원 기본키를 포함시켜 회원을 구분한다. 하지만 이 방법은 서버의 자원을 사용하기 때문에 접속자가 많을 경우 ..

Backend/Java

@RequestBody 모델에 기본생성자, setter/getter가 필요한가?

서론 최근에 Entity 모델의 속성의 성격을 잘 생각해보고 불변해야 하는 것들은 final로 선언해 명확하게 하라는 코드리뷰를 받았다. 한번 생성되면 변하면 안되는 것들, 이 속성 없이 생성되면 안되는 것들은 추후에 변경돼 에러를 발생시킬 위험이 있고 규모가 커지면 추적하기 어렵다는 것이 이유였다. 오... final! 간단하군! 했는데 여러 문제에 봉착했다. 테스트 코드 작성의 어려움, 객체 변환에 어려움. Builder패턴... 여러가지로 전체적인 코드스타일이 변경되어야 했다. 아무튼, 여러 문제점 중에 여기서 말할 것은 객체 매핑이다. final로 선언된 속성이 있으면 기본생성자는 만들 수 없고 또한 setter 함수도 작성 불가능하다. 그런데 Spring Controller에서 자동으로 객체 매..

Backend/Java

parse, valueOf 차이와 문제점

평소에 valueOf를 많이 썼는데 valueOf는 예외에 안전하지 않은 함수라서 org.apache.commons.lang3의 toLong을 사용하라는 코드 리뷰를 받았다. 무슨 차이가 있는 걸까? 형변환 함수 자바에서 형변환 할 수 있는 함수는 parse와 valueOf가 있다. parse는 원시형으로 타입을 반환하고 valueOf는 이를 wrap 한 클래스형으로 반환한다. long a = Long.parseLong(1); Long A = Long.valueOf(1); 이러한 형식의 문제점은 변환하려는 값에 문자가 올 경우 예외를 던진다는 것이다. 물론 그럴 가능성은 적겠지만, 안정적인 프로그램을 만들려면 사용자가 넣을 수 있는 값을 모두 고려해야 한다. Long.parseLong("99", 8) /..

Backend/Java

Repository와 DAO 차이?

서론 Spring MVC를 사용할 때는 DAO를 데이터베이스를 연결하는 객체로 생각하고 여기에 SQL문을 다 넣었었다. JPA를 배우고 난 뒤에 JpaRepository를 구현하면서 DAO는 자연스럽게 Repository로 생각하고 넘겼었다. 그러다 이 둘의 차이를 묻는 질문 글을 발견했고 그 답변의 내용이 상당히 어려웠다. 조금이나마 이해한 것을 번역하면서 글로 정리하지 않으면 다 잊어버릴까 봐 이렇게 글로 나마 정리한다. 내가 이해한 것을 토대로 작성하기 때문에 틀린 내용이 많을 수도 있다. 이 글은 답변 글 번역에 단순히 내 생각을 덧붙인 글로 나는 명확한 차이를 모르겠다. #1 DAO는 data persistence의 추상화다. Repository는 a collection of objects의 추..

Backend/Java

[Spring Boot] 유효성 검사

※ SpringBoot를 활용한 REST 개발 공부 중, HTTP RequestBody 유효성 검사에 관한 내용을 정리한 자료입니다. @Test @DisplayName("username 없이, POST 회원가입 , 400 badRequest") public void post_whenUsernameIsNull_receiveBadRequest() { User user = TestUtil.createValidUser(); user.setUsername(null); ResponseEntity response = postUser(user, Object.class); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.BAD_REQUEST); } 회원 Entity..

Backend/Python

[인스타그램클론] 폼 에러메시지 표시

문제 현상 이메일에 잘못된 형식이 들어가도 에러메시지가 뜨지 않음 그냥 DB에 저장도 되지 않고 다음 페이지로 리다이렉트 됨 원인 def post(self, request): current_user = User.objects.get(pk=request.user.pk) user_form = UserForm(request.POST, instance=current_user) if user_form.is_valid(): user_form.save() # PROFILE UPDATE if hasattr(current_user, "profile"): profile = current_user.profile profile_form = ProfileForm( request.POST, request.FILES, instan..

Backend/Java

[JSP] 쿼리문 실행 오류

java.sql.SQLSyntaxErrorException: ORA-00900: SQL 문이 부적합합니다 SQL 문법오류에 여러가지 이유가 있지만 이번 경우에는 툴 명령어와 SQL 조회문을 구분하지 못해서 생긴 문제 DESC는 SQL문이 아닌 SQLPLUS툴의 명령어 따라서 SQL문이 부적합하다는 오류가 발생 DESC EMP-- SQLPLUS 데이터 구조 조회 명령어 TABLE의 데이터를 조회하기 위해서는 USER_TABLES 테이블에서 필요한 컬럼을 추출해야함 SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH, NULLABLE FROM USER_TAB_COLUMNS WHERE TABLE_NAME='EMP' ORDER BY COLUMN_ID 컬럼명 컬럼형식 컬럼길이 널값여부 참..

Backend/Python

[인스타그램 클론] 단일 페이지에 모델 폼 추가하기

인스타그램 클론 코딩의 일환으로 회원가입 페이지를 만들던 중 회원가입을 완료하고 로그인하면 오류가 뜸 회원가입한 유저의 프로필 이미지와 닉네임이 없어서 오류 발생 첫번째 시도 Model에서 profile_photo 디폴트 설정 class Profile(models.Model): user = models.OneToOneField( settings.AUTH_USER_MODEL, on_delete=models.CASCADE)# 장고 유저모델 사용 nickname = models.CharField(max_length=20)# 회원가입 페이지에서 값을 받을 것임 profile_photo = models.ImageField( upload_to="profile/", blank=True, default="default..

비비빅B
'Backend' 카테고리의 글 목록 (3 Page)