Backend 32

Repository와 DAO 차이?

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

Backend/Java 2021.01.14

[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/Java 2020.12.16

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

문제 현상 이메일에 잘못된 형식이 들어가도 에러메시지가 뜨지 않음 그냥 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/Python 2020.07.18

[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/Java 2020.07.09

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

인스타그램 클론 코딩의 일환으로 회원가입 페이지를 만들던 중 회원가입을 완료하고 로그인하면 오류가 뜸 회원가입한 유저의 프로필 이미지와 닉네임이 없어서 오류 발생 첫번째 시도 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..

Backend/Python 2020.06.17

[인스타그램 클론] Vanilla JS - AJAX

인스타그램 클론 코딩 중 댓글 기능 구현을 위해 AJAX를 써야 했음 요즘 제이쿼리는 지양하는 추세라고 해서 바닐라 JS로 작성해봄 DB모델 class Photo(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="photos") image = models.ImageField(upload_to="media/") filtered_image = ImageSpecField(source='image', processors=[ ResizeToFill(293, 293)], format="JPEG", options={'quality': 60}) content = models.Tex..

Backend/Python 2020.06.08

[JSP] 한글 인코딩

한글 출력 기본 원칙 인코딩과 디코딩할 때 chatset 을 맞춰서 해야함 보통 jsp파일에 바로 한글 쓰는 것은 문제되지 않음 디렉티브 태그 setContentType과 pageEncoding에서 인코딩과 디코딩을 처리해줌 그러나 url로 넘기거나 request로 다른 jsp파일로 값을 넘기는 경우에는 다름 인코딩과 디코딩을 직접 지정해줘야함 Base64 java.util.Base64 response.sendRedirect("main.jsp?name="+Base64.getEncoder().encodeToString("홍길동".getBytes())); // http://localhost:8080/jspwork/ch05_1/main.jsp?name=yKux5rW/ // main.jsp 님 안녕하세요!// ..

Backend/Java 2020.05.28

[안드로이드] 키보드 리스너 정의

activity_main.xml 먼저 키보드 타입 속성을 지정하는 inputType 지정 EditText 위젯에 imeOptions 키보드 작업 속성 지정 actionSend로 넣어주면 보내기 버튼이 생김 Mainactivity.java public class MainActivity extends AppCompatActivity { EditText search; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 렌더링할 content 지정 search = (EditText) findViewById(R.i..

Backend/Java 2020.05.20

[안드로이드/자바] 익명 내부 클래스 변수 범위(final)

오류 public class MainActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EditText input1 = (EditText) findViewById(R.id.input1);// EditText 선언과 동시에 초기화 Button btn1 = (Button) findViewById(R.id.btn1); btn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(Vi..

Backend/Java 2020.05.19

중복값 갯수(collections.Counter)

빈 Dictionary 이용: words = "a b c d a c" word_list = words.split()# ['a', 'b', 'c', 'd', 'a', 'c'] dict = {}#빈 딕셔너리 for word in word_list: if word in dict:# 이미 있는 키 dict[word] += 1 else:# 처음 보는 키 dict[word] = 1 for key,value in dict.items(): print("{}: {}개".format(key, value), end=" ")# a: 2개 b: 1개 c: 2개 d: 1개 리스트에서 중복되는 값의 갯수를 알고 싶을 때, 값을 split()로 나눈 후 빈 딕셔너리 생성 이미 있는 경우, 없는 경우로 나눠서 갯수를 세렸다. Coun..

Backend/Python 2020.05.02