전체 글 50

Github-flow, Git-flow (1)

서론 최근에 학원에서 팀프로젝트를 하나 했는데, git branch에 익숙하지도 않고 시간에 쫓기다보니 그냥 master branch에 다 커밋했었다. 그러다보니 깃허브 커밋 이력이 엉망진창이다. 이번 기회에 글을 정리하며 깃허브 커밋 관리에 대해 좀 더 이해해보려 한다. Git Flow 예전에 branch를 공부하면서 얼핏 본 기억이 나는 그림이다. 배울 당시에도 좀 복잡했지만 실무에서는 이렇게 쓰겠구나하는 감이 와서 좋았었다. 위 그림만 봐도 어떻게 브랜치 형상관리가 이뤄지는지 알 수 있다. branch는 총 5개로 구분해서 관리한다. master : 제품으로 출시될 수 있는 브랜치 develop : 다음 출시 버전을 개발하는 브랜치 feature : 기능을 개발하는 브랜치 release : 이번 출..

Tools/git 2020.11.06

왜 오프셋 페이징보다 커서 페이징일까?

Is offset pagination dead? Why cursor pagination is taking over Facebook’s developer page said it best: uxdesign.cc ※ 이 글은 위 글을 의역한 글입니다. ※ 제가 이해한 것을 토대로 약간 수정했습니다. 커서 기반 페이징이 가장 효율적인 방법이며, 가능한 항상 사용되어야 한다 -페이스북 개발자 그렇다면 페이징은 무엇일까? 페이징은 책 페이지처럼 데이터를 묶음으로 분리하는 과정이다. 페이징은 크게 2개로 나뉘는데, 둘 중 뭐가 좋을까? 한 번 알아보자. 오프셋 페이징 이 방법은 수십년동안 효과적으로 사용된 방법이다. OFFSET 값을 포함한 SQL 쿼리문을 동반한다. SELECT * FROM table ORDER B..

이론 2020.11.01

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

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

[오라클]특정 열 중복값 null 처리

데이터 생성 with t (col1, col2, col3) AS ( SELECT '아파트1', 60, 30000 FROM DUAL UNION ALL SELECT '아파트1', 60, 35000 FROM DUAL UNION ALL SELECT '아파트1', 70, 40000 FROM DUAL UNION ALL SELECT '아파트1', 80, 45000 FROM DUAL UNION ALL SELECT '아파트2', 100, 50000 FROM DUAL UNION ALL SELECT '아파트2', 120, 50000 FROM DUAL UNION ALL SELECT '아파트3', 100, 50000 FROM DUAL UNION ALL SELECT '아파트4', 100, 50000 FROM DUAL) 방법1 :..

DB/Oracle 2020.07.13

[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

[오라클] 계층구조 쿼리

SELECT JOB, EMPNO, ENAME, MGR FROM EMP; 데이터의 계층적인 구조를 표현하는 데 사용함 MRG은 상급자의 EMPNO임 PRESIDENT KING은 사장이라 상급자가 없음 SELECT LEVEL, LPAD(' ', (LEVEL-1)*3) || JOB AS JOB, EMPNO, ENAME, MGR FROM EMP START WITH JOB = 'PRESIDENT' CONNECT BY PRIOR EMPNO = MGR; START WITH 계층구조가 어떤 행에서 시작할지 지정함 뒤에 조건식을 요구함 WHERE절 처럼 자유롭게 서브쿼리까지 가능하나 조건에 맞는 행이 2개 넘으면 이상해짐 유지보수차원에서 JOB = "PRESIDENT"보다 MGR IS NULL이 더 좋긴 함 JOB 데이..

DB/Oracle 2020.05.25

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

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